package xml.parserDTD;

import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import xml.parserDOM.Arbol;

import xml.parserSAX.SAXException;

public abstract class GenerarDOMDTD {


	/**
	 * Funcion que se encarga de leer el archivo dtd, atraves de este y un arbol 
	 * pasado por parametro. Valida que el XML tenga la estructura que indica el 
	 * dtd
	 * @param file lineas del archivo dtd
	 * @param arbol pasado por parametro, el cual se validara su estructura
	 * @throws SaxException
	 */
	public static void generarDTD(String[] file, Arbol arbol)
			throws SAXException {

		String regex = "<\\?xml.*>|<!ELEMENT\\s+(\\w+)\\s+\\((.*)\\)\\s*>|<!ATTLIST\\s+(\\w+)\\s+(\\w+)\\s+(\\w+)\\s+#(\\w+)\\s*>|<!-- (\\w+)";

		// compilamos el patron

		Pattern pattern = Pattern.compile(regex);
		DTDSaxHandler dtdHandler = new DTDSaxHandler();

		String patron = "(\\w+)([+*?])?|#(\\w+)";

		try {
			for (String line : file) {
				Matcher matcher = pattern.matcher(line);
				matcher.find();
				// leo ELEMENT
				if (matcher.group(1) != null) {
					// leo el grupo 2 de la expresion regular
					String word = matcher.group(2);
					// separa lo que lee del matcher por comas
					StringTokenizer st = new StringTokenizer(word, ",");
					// creo el array list que contendra los elementos que separo
					// el tokeizer
					ArrayList<ElementoDtd> elementos = new ArrayList<ElementoDtd>();
					// recorre elementos separados
					while (st.hasMoreTokens()) {
						// leo la palabra
						String elemento = st.nextToken();
						Pattern patToken = Pattern.compile(patron);
						Matcher mat = patToken.matcher(elemento);
						mat.find();

						if (mat.group(2) != null) {
							elementos.add(new ElementoDtd(mat.group(1), mat
									.group(2).toCharArray()[0]));
						} else {
							if (mat.group(3) != null) {
								elementos.add(new ElementoDtd(mat.group(3), '1'));

							}else
							{
								elementos.add(new ElementoDtd(mat.group(1), '1'));
							}
						}
						

					}
					
					dtdHandler.startElement(arbol, "ELEMENT", matcher.group(1),
							elementos, null, null, null);

				}

				// leo ATTLIST
				if (matcher.group(3) != null) {// leo el grupo 2 de la expresion
												// regular
					String qName = matcher.group(3);
					String qAtributo = matcher.group(4);
					String atributoTipo = matcher.group(5);
					Boolean isReString = false;
					String grupo6 = matcher.group(6).toString();
					if (grupo6.equals("REQUIRED")) {
						isReString = true;
					}

					dtdHandler.startElement(arbol, "ATTLIST", qName,
							null, qAtributo, atributoTipo, isReString);

				}
			}
		} catch (IllegalStateException e) {
			throw new SAXException(SAXException.Tipo.ERROR, "Error de sintaxis en el DTD");
		}
	}

}
